import numpy as np

class SimpleLinearRegression1:
    def __init__(self):
        """初始化 线性回归 模型"""
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根据训练数据集x_train, y_train训练 线性回归 模型"""
        assert x_train.ndim == 1, "当前线性回归模型只能支持仅有一个特征的训练数据"
        assert len(x_train) == len(y_train), "训练数据个数和结果个数必须相等"

        # x的均值
        x_mean = np.mean(x_train)
        # y的均值
        y_mean = np.mean(y_train)

        # 分子
        num = 0.0
        # 分母
        d = 0.0

        for x_i, y_i in zip(x_train, y_train):
            num += (x_i - x_mean) * (y_i - y_mean)
            d += (x_i - x_mean) ** 2
        self.a_ = num / d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """给定待预测数据集x_predict，返回x_predict的结果向量"""
        assert x_predict.ndim == 1, "待预测数据集必须为1维向量"
        assert self.a_ is not None and self.b_ is not None, "必须先调用fit方法传入训练数据"

        return np.array([self._predict(x_single) for x_single in x_predict])

    def _predict(self, x_single):
        """给定单个待预测数据x_single，返回x_single的预测结果值"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        return "SimpleLinearRegression1()"